<?php

namespace houze;

/**
 * 商城操作类
 */ 
class Shop{
    
    /**
     * 获取无限级分类树
     * @param array $list 数据集
     * @param string $pk ID键
     * @param string $pid 父ID键
     * @param string $child 子集分类键
     * @param array $extend 扩展数组 索引0设置key:key 索引1设置key:value
     * @param string $root 一级分类值
     * @return array
     */ 
    public static function getTree($list=null, $pk='id', $pid='pid', $child='_child', $extend=[],$root=0){
        // 如果list为空开启测试案例
        if(empty($list)){
            $list = array(  
                array('id'=>'1','name'=>'北京','pid'=>'0'),  
                array('id'=>'2','name'=>'上海','pid'=>'1'),  
                array('id'=>'3','name'=>'浦东','pid'=>'1'),  
                array('id'=>'4','name'=>'朝阳','pid'=>'5'),  
                array('id'=>'5','name'=>'广州','pid'=>'7'),  
                array('id'=>'6','name'=>'三里屯','pid'=>'0'),  
                array('id'=>'7','name'=>'广东','pid'=>'0'),  
                array('id'=>'8','name'=>'三里','pid'=>'0') 
            ); 
        }
        // 创建Tree
        $tree = [];
        if(is_array($list)) {
            // 创建基于主键的数组引用
            $refer = [];
            foreach ($list as $key => $data) {
                $refer[$data[$pk]] =& $list[$key];
            }
            foreach ($list as $key => $data) {
                // 判断是否存在parent
                $parentId =  $data[$pid];
                if ($root == $parentId) {
                    // 父级合并扩展数组
                    $list = self::extend($list, $key, $data, $extend);
                    $tree[] =& $list[$key];
                }else{
                    if (isset($refer[$parentId])) {
                        $parent =& $refer[$parentId];
                        // 子级合并扩展数组
                        $list = self::extend($list, $key, $data, $extend);
                        $parent[$child][] =& $list[$key];
                    }
                }
            }
        }
        return $tree;
    }
    
    /**
     * 扩展插入方法
     * @param $extend['where'] array 条件设置参数 ['参数', '条件', '满足条件值', '不满足条件值']
     */ 
    private static function extend($list, $key, $data, $extend){
        if(isset($extend[0])){
            $extend = $extend[0];
            foreach ($extend as $e_k => $e_v){
                if(is_array($e_v)){
                    $extend = [];
                    foreach ($e_v as $e_arr_k => $e_arr_v){
                        if($e_arr_k != 'where') $extend[$e_arr_k] = $list[$key][$e_arr_v];
                        // 条件判断
                        if($e_arr_k == 'where') {
                            foreach($e_arr_v as $e_arr_v_w_k => $e_arr_v_w_v){
                                if($extend[$e_arr_v_w_v[0]] == $e_arr_v_w_v[1]){
                                    $extend[$e_arr_v_w_v[0]] = $e_arr_v_w_v[2];
                                } else{
                                    $extend[$e_arr_v_w_v[0]] = $e_arr_v_w_v[3];
                                }
                            }
                        }
                    }
                    $list[$key][$e_k] = $extend;
                }else{
                    $list[$key][$e_k] = $list[$key][$e_v];
                }
            }
        }
        if(isset($extend[1])){
            $extend = $extend[1];
            foreach ($extend as $e_k => $e_v){
                $list[$key][$e_k] = $e_v;
            }
        }
        
        return $list;
    }
    
    // 生成唯一随机订单号
    public static function getOrderNo($user_id = 1){
        // 生成一个8位随机码
        $code = self::makeInviteCode();         
        // 订单编号(27)：当前时间戳(10)+ 当前微秒（6） +3位随机数(3) + 当前用户的唯一邀请码(8)
        $order_no =  (strtotime(date('YmdHis', time()))) . substr(microtime(), 2, 6) . sprintf('%03d', rand(0, 999)).$code;
        return $order_no;
    }
    
    // 生成唯一随机邀请码
    public static function makeInviteCode(){
        $code="ABCDEFGHIGKLMNOPQRSTUVWXYZ";
        $rand=$code[rand(0,25)].strtoupper(dechex(date('m')))
        .date('d').substr(time(),-5)
        .substr(microtime(),2,5).sprintf('%02d',rand(0,99));
        for(
            $a = md5($rand, true),
            $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',
            $d = '',
            $f = 0;
            $f < 8;
            // ord（）函数获取首字母的 的 ASCII值
            $g = ord( $a[ $f ] ), 
            // 按位亦或，按位与。
            $d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],  
            $f++
        );
        return $d;
    }
}